package chapter04

/**
  * for 循环
  */
object Test02_ForLoop {

  def main(args: Array[String]): Unit = {

    //1. 范围遍历
    for (i <- 1 to 10) {
      println(s"$i,hello world")
    }
    // 或 to方法 为隐式转换,scala.LowPriorityImplicits.intWrapper
    for (i <- 1.to(10)) {
      println(s"$i,hello world")
    }

    //2.集合遍历
    var list = List("hello", 10, 20, "tom")
    for (item <- list) {
      println(s"list输出的值:$item")
    }

    var set = Set("hello", 10, 20, "tom")
    for (item <- set) {
      println(s"set输出的值:$item")
    }

    var array = Array("hello", 10, 20, "tom")
    for (item <- array) {
      println(s"array输出的值:$item")
    }

    //3.不包含边界遍历
    for (i <- 1 until 10) {
      println(s"$i,hello world,不包含右边界1")
    }
    // 或者
    for (i <- Range(1, 10)) {
      println(s"$i,hello world,不包含右边界2")
    }

    //4.循环守卫，即循环保护式（也称条件判断式，守卫）。保护式为true则进入循环体内部，为false则跳过，类似于continue
    for (i <- 1 to 10 if i / 2 == 2) {
      println(s"$i,hello world,循环守卫")
    }
    // 5.引入变量,j与i相关联,j为引入变量
    for (i <- 1 to 10; j = i * 2) {
      println(s"$i,hello world,引入变量j=$j")
    }
    // 5.1九层妖塔
    for (i <- 1 to 9; stars = 2 * i - 1; spaces = 9 - i) {
      println(" " * spaces + "*" * stars)
    }
    // 6. 嵌套循环
    for (i <- 1 to 10; j <- 1 to 10) {
      println(s"i=$i,hello world,嵌套循环1========j=$j")
    }
    // 或
    for (i <- 1 to 10) {
      for (j <- 1 to 10) {
        println(s"i=$i,hello world,嵌套循环1====j=$j")
      }
    }
    //7.1 循环返回值1
    /**
      * 说明 val res = for(i <- 1 to 10) yield i 含义
      *     1. 对1 to 10 进行遍历
      *     2. yield i 将每次循环得到i 放入到集合Vector中，并返回给res
      *     3. i 这里是一个代码块，这就意味我们可以对i进行处理
      *     4. 下面的这个方式，就体现出scala一个重要的语法特点，就是将一个集合中个各个数据
      * 进行处理，并返回给新的集合
      */
    val vector = for (i <- 1 to 10) yield {
      if (i % 2 == 0) i else "不是偶数"
    }
    println("循环返回值:" + vector)

    // 7.2 循环返回值2
    /**
      * {}和()对于for表达式来说都可以
      * for 推导式有一个不成文的约定：当for 推导式仅包含单一表达式时使用圆括号，当其包含多个表达式时使用大括号
      * 当使用{} 来换行写表达式时，分号就不用写了
      */
    for {i <- 1 to 10
         j = i * 3
    } yield {
      println(s"i:$i:j:$j")
    }


    // 8. 控制步长
    //8.1 不包含10
    for (i <- Range(2, 10, 2)) {
      println("使用循环守卫控制步长方式一" + i)
    }
    //8.2 包含10
    for (i <- 2 to 10 by 2) {
      println("使用循环守卫控制步长方式二" + i)
    }
    //8.2 递减
    for (i <- 20 to 10 by -2) {
      println("使用循环守卫控制步长方式二递减" + i)
    }
    //8.3 reverse控制递减
    for (i <- 1 to 10 reverse) {
      println("使用循环守卫控制步长方式三递减" + i)
    }
    //8.3 小数,不精确
    println("**************************")
    for (i <- 1.0 to 10.0 by 0.22) {
      println("控制步长小数,i=" + i)
    }

    //8.4 控制步长的第四种方式-for循环守卫
    println("**************************")
    for (i <- 1 to 10 if i % 2 == 1) {
      println("i=" + i)
    }

  }
}
